package es.qb.deportivos.il.dal.impl;

import java.util.ArrayList;
import java.util.List;

import javax.persistence.PersistenceException;
import javax.persistence.TypedQuery;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;

import es.qb.deportivos.exception.GeneralDAOException;
import es.qb.deportivos.il.dal.interfaces.PuntosDAO;
import es.qb.deportivos.il.domain.Puntos;
import es.qb.deportivos.util.Utilities;

public class PuntosDAOImpl extends GeneralDAOImpl<Puntos> implements PuntosDAO {

	@SuppressWarnings({ "unchecked", "rawtypes" })
	public List<Puntos> buscarPuntos(Puntos puntos) throws GeneralDAOException {

		List<Puntos> lstPuntos = new ArrayList<Puntos>();

		try {

			CriteriaBuilder criteriaBuilder = getJpaTemplate().getEntityManager().getCriteriaBuilder();
			CriteriaQuery<Object> criteriaQuery = criteriaBuilder.createQuery();

			Root<Puntos> from = criteriaQuery.from(Puntos.class);

			CriteriaQuery<Object> select = criteriaQuery.select(from);
			select.orderBy(criteriaBuilder.asc(from.get("id")));
			List<Predicate> lstPredicate = new ArrayList<Predicate>();

			// Partido.
			Predicate predicatePartido = null;
			if (Utilities.validarInteger(puntos.getPartido().getId())) {
				predicatePartido = criteriaBuilder.equal(from.get("partido").get("id"), puntos.getPartido().getId());
				lstPredicate.add(predicatePartido);
			}

			// JugadorJurado
			Predicate predicateJugadorJurado = null;
			if (Utilities.validarInteger(puntos.getJugadorJurado().getId())) {
				predicateJugadorJurado = criteriaBuilder.equal(from.get("jugadorJurado").get("id"), puntos.getJugadorJurado().getId());
				lstPredicate.add(predicateJugadorJurado);
			}

			// JugadorVotado
			Predicate predicateJugadorVotado = null;
			if (Utilities.validarInteger(puntos.getJugadorVotado().getId())) {
				predicateJugadorVotado = criteriaBuilder.equal(from.get("jugadorVotado").get("id"), puntos.getJugadorVotado().getId());
				lstPredicate.add(predicateJugadorVotado);
			}

			criteriaQuery.where(criteriaBuilder.and(Utilities.crearPredicateVariable(lstPredicate)));

			TypedQuery<Object> typedQuery = getJpaTemplate().getEntityManager().createQuery(select);
			lstPuntos = (List) typedQuery.getResultList();

			return lstPuntos;
		} catch (PersistenceException e) {
			throw new GeneralDAOException("IL-DAL-BUSCARPUNTOS", "Se ha producido un error al buscar los puntos." + e);
		}
	}
}
